/*
Promise.finally() 方法用于指定不管 Promise 对象最后状态如何，都会执行的操作。
该方法接受一个回调函数作为参数，该回调函数在 Promise 对象状态确定后（即 resolved 或 rejected）,执行的操作与 finally 方法无关，
反之该 Promise 对象的状态没有改变时，它的回调函数不会执行。

Promise.finally()  方法返回的仍然是一个 Promise 对象，所以它可以继续链式调用。
如果在  finally  方法中返回一个新的 Promise 对象，则会等待该 Promise 对象返回后，再继续执行后面的代码。
 */
// 它接受一个回调函数  callback  作为参数，该回调函数将在  Promise  对象状态确定后执行。
// 无论  Promise  对象的状态是  resolved  还是  rejected ，该回调函数都会被执行。
Promise.prototype.myFinally = function (callback) {
    // 还是return一个Promise
    return this.then(
        // 第一个参数 resolve调用的
        // 如果  Promise  对象被成功处理，则会首先执行  callback()  回调函数，然后将其返回的值作为新的Promise对象(也就是Promise.resolve干的事)的值继续链式调用
        // then(() => value)就是无论传什么参数进去都返回value 原封不动了相当于
        (value) => Promise.resolve(callback()).then(() => value),
        // 第二个参数 reject调用的
        // 如果  Promise  对象被拒绝，则会首先执行  callback()  回调函数，然后将其返回的错误对象  throw  出来，以便后续的  catch()  方法继续处理
        (error) =>
            Promise.resolve(callback()).then(() => {
                throw error;
            })
    );
};

function asyncFunc() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('Success!');
        }, 1000);
    });
}

asyncFunc()
    // 这里肯定能执行 因为他返回一个Promise(通过then((resolve,reject)))
    .myFinally(() => {
        console.log('finally has been executed');
    })
    // 然后这里再调用then时 会用到上面finally的结果，而finally的结果就是里面回调函数执行后return的不改变value的Promise
    .then((value) => {
        console.log(value);  // 输出: "Success!"
    })
    .catch((error) => {
        console.error(error);
    });
